Trim the dataset

Remove outliers

Some species are lost in the trimmed dataset

Remove samples at present (or with negative age)


 FALSE   TRUE 
512259    682 

Reverse negative uncertainty ranges

2 species have a speciation date of 0.0. Change it to the oldest fossil age.

[1] "Berggrenia pumilio"   "Globigerinita minuta"
 [1] "species"           "rowID"             "orig.species"      "abundance"         "orig.abundance"    "abun.units"        "sample.depth"      "segment"          
 [9] "age"               "age.err"           "age.calc"          "zone"              "zon.age"           "age.st"            "age.en"            "rng.age"          
[17] "int.age"           "err.int.age"       "mag.zone"          "mag.age.st"        "mag.age.en"        "mag.age"           "int.mag.age"       "err.int.mag.age"  
[25] "mod.age"           "r2"                "n.pts"             "age.model"         "AM.type"           "latitude"          "longitude"         "pal.lat"          
[33] "pal.long"          "water.depth"       "db.source"         "dbID"              "holeID"            "sampleID"          "reason"            "leg"              
[41] "site"              "hole"              "core"              "section"           "sample.top"        "sample.type"       "total.IDd"         "preservation"     
[49] "processing"        "person"            "date"              "year"              "source"            "num.ind"           "rel.abun"          "round.age"        
[57] "round.lat"         "round.pal.lat"     "Macro/micro"       "orig.st"           "orig.en"           "Zone.st"           "Zone.en"           "Zone.st.ref"      
[65] "Zone.en.ref"       "orig.ts"           "St.Date.reference" "En.Date.reference" "Speciation"        "Extinction"        "trim"             

Check the repartition through time

Full fossil record

Each occurrence is associated with a stratigraphic age uncertainty interval (minimum and maximum ages).

Add age uncertainty to avoid occurrences with the same age

Many occurrences have the exact same age.


 0.01  0.02  0.04  0.03  0.12 
16549  6556  4914  4702  4070 

In order to avoid clusters let’s draw them uniformly in their interval rather than taking the midpoint (for the “Zone” and “Magneto” methods).

For other methods, simply add 10000 yrs uncertainty around age estimates, reflecting uniformisation in the sedimentation process.


8.91956830861745e-07 4.58073036833413e-06 5.62783745405112e-05 7.45228141946788e-05 9.40664828176489e-05 
                   1                    1                    1                    1                    1 

The issue is now solved.

Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
Please use the `linewidth` argument instead.

Check the repartition of occurrences per species


      Globigerina bulloides     Globigerinita glutinata Neogloboquadrina pachyderma           Orbulina universa   Neogloboquadrina incompta 
                      18558                       18522                       15570                       14855                       13564 
      Globigerinoides ruber        Globoconella inflata   Turborotalita quinqueloba          Hirsutella scitula       Trilobatus sacculifer 
                      13414                       12248                       11668                       11341                       10648 

Some species have much more occurrences than others. Let’s compare the distribution of number of occurrences in Triton compared to a Poisson sampling over the species lifetime.

The expected distribution is more unequal: the rarest species have fewer occurrences, the median species has around 100 occurrences, for nearly 250 in Triton.

Save database

Warning: cannot open file '../Triton_processed/TritonDB_trimmed_runif.csv': No such file or directoryError in file(file, ifelse(append, "a", "w")) : 
  cannot open the connection
LS0tCnRpdGxlOiAiQ2xlYW4gdGhlIHJhdyBUcml0b24gZGF0YWJhc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJhcGUiKQpgYGAKCmBgYHtyfQojIExvYWQgb2NjdXJyZW5jZSBkYXRhc2V0CmxvYWQoIi4uLy4uLzEtRGF0YV9yYXcvVHJpdG9uREIvdHJpdG9uLlJEYXRhIikKYGBgCgojIFRyaW0gdGhlIGRhdGFzZXQKIyMgUmVtb3ZlIG91dGxpZXJzCgpgYGB7cn0KIyBXb3JrIG9uIHRoZSB0cmltbWVkIGRhdGFzZXQsIHdoaWNoIGV4Y2x1ZGVzIG9jY3VycmVuY2VzIHRoYXQgZmFsbCBzaWduaWZpY2FudGx5IG91dHNpZGUgdGhlIGtub3duIHJhbmdlIG9mIHRoZSBzcGVjaWVzLiBUaGUgY3V0LW9mZiBmb3IgdGhlIE5lb2dlbmUgaXMgMk1hIG91dHNpZGUgdGhlIHNwZWNpZXMga25vd24gcmFuZ2UsIGFuZCA1TWEgZm9yIHRoZSBQYWxhZW9nZW5lIChjZi4gRmVudG9uIGV0IGFsLiAyMDIxKS4KdHJpdG9uIDwtIHRyaXRvbi5wcmVzW3RyaXRvbi5wcmVzJHRyaW0gPT0gImluYyIsXQpgYGAKClNvbWUgc3BlY2llcyBhcmUgbG9zdCBpbiB0aGUgdHJpbW1lZCBkYXRhc2V0CgpgYGB7cn0Kc3BlY2llc19sb3N0IDwtIHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKVshKHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKSAlaW4lIHVuaXF1ZSh0cml0b24kc3BlY2llcykpXQp0cml0b24ucHJlc1t0cml0b24ucHJlcyRzcGVjaWVzICVpbiUgc3BlY2llc19sb3N0LF0KYGBgCgojIyBSZW1vdmUgc2FtcGxlcyBhdCBwcmVzZW50IChvciB3aXRoIG5lZ2F0aXZlIGFnZSkKCmBgYHtyfQojIFNvbWUgc2FtcGxlcyBoYXZlIGEgbmVnYXRpdmUgYWdlCnRhYmxlKHRyaXRvbi5wcmVzJGFnZTwwKQpgYGAKCmBgYHtyfQojIEtlZXAgb25seSBwYXN0IG9jY3VycmVuY2VzCnRyaXRvbiA8LSB0cml0b25bdHJpdG9uJGFnZSA+IDAsXQpgYGAKCiMjIFJldmVyc2UgbmVnYXRpdmUgdW5jZXJ0YWludHkgcmFuZ2VzCgpgYGB7cn0KZGF0YS5mcmFtZShwb3NpdGl2ZSA9IHN1bSh0cml0b24kcm5nLmFnZSA+IDAsIG5hLnJtPVQpLCAKICAgICAgICAgICBudWxsID0gc3VtKHRyaXRvbiRybmcuYWdlID09IDAsIG5hLnJtPVQpLCAKICAgICAgICAgICBuZWdhdGl2ZSA9IHN1bSh0cml0b24kcm5nLmFnZSA8IDAsIG5hLnJtPVQpKQojdHJpdG9uIDwtIHRyaXRvbltzYXBwbHkodHJpdG9uJHJuZy5hZ2UgPiAwLCBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmEoeCksIEYsIHgpKSxdCmFnZS5taW4gPC0gYXBwbHkodHJpdG9uWyxjKCJhZ2UuZW4iLCAiYWdlLnN0IildLCAxLCBtaW4pCmFnZS5tYXggPC0gYXBwbHkodHJpdG9uWyxjKCJhZ2UuZW4iLCAiYWdlLnN0IildLCAxLCBtYXgpCnRyaXRvbiRhZ2UuZW4gPC0gYWdlLm1pbgp0cml0b24kYWdlLnN0IDwtIGFnZS5tYXgKdHJpdG9uJHJuZy5hZ2UgPC0gdHJpdG9uJGFnZS5zdCAtIHRyaXRvbiRhZ2UuZW4KYGBgCgojIyAyIHNwZWNpZXMgaGF2ZSBhIHNwZWNpYXRpb24gZGF0ZSBvZiAwLjAuIENoYW5nZSBpdCB0byB0aGUgb2xkZXN0IGZvc3NpbCBhZ2UuCgpgYGB7cn0KdW5pcXVlKHRyaXRvblt0cml0b24kU3BlY2lhdGlvbj09MCxdJHNwZWNpZXMpCnRyaXRvblt0cml0b24kc3BlY2llcz09IkJlcmdncmVuaWEgcHVtaWxpbyIsXSRTcGVjaWF0aW9uIDwtIG1heCh0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJCZXJnZ3JlbmlhIHB1bWlsaW8iLF0kYWdlKQp0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJHbG9iaWdlcmluaXRhIG1pbnV0YSIsXSRTcGVjaWF0aW9uIDwtIG1heCh0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJHbG9iaWdlcmluaXRhIG1pbnV0YSIsXSRhZ2UpCmBgYAoKYGBge3J9Cm5hbWVzKHRyaXRvbikKYGBgCiMgQ2hlY2sgdGhlIHJlcGFydGl0aW9uIHRocm91Z2ggdGltZQojIyBGdWxsIGZvc3NpbCByZWNvcmQKCkVhY2ggb2NjdXJyZW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYSAqKnN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IGludGVydmFsKiogKG1pbmltdW0gYW5kIG1heGltdW0gYWdlcykuCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xNX0KZ2dwbG90KHRyaXRvblshaXMubmEodHJpdG9uJHJuZy5hZ2UpLF0pICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtYWdlLnN0LCB5ID0gLWFnZSwgeGVuZCA9IC1hZ2UuZW4sIHllbmQ9LWFnZSwgY29sb3I9LWFnZSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIk9jY3VycmVuY2VzIikgKwogIGxhYnMoY29sb3VyPSJNZWFuIGFnZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgYWdlIGludGVydmFscywgZGVwZW5kaW5nIG9uIHRoZSBhZ2UgY2FsY3VsYXRpb24gbWV0aG9kIikgKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGZhY2V0X2dyaWQoLiB+IGFnZS5jYWxjKQpgYGAKCmBgYHtyLCBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTE1fQpwIDwtIGdncGxvdCh0cml0b24sIGFlcyh4PS1hZ2UsIHk9cm5vcm0obGVuZ3RoKGFnZSksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMDEsIGFscGhhPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiT2NjdXJyZW5jZXMiLCBsaW1pdHMgPSBjKDAuNywgMS4zKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGxpbmV3aWR0aCA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJUZW1wb3JhbCByZXBhcnRpdGlvbiBvZiIsIGRpbSh0cml0b24pWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgLSBNaWRwb2ludCIpKQoKcSA8LSBnZ3Bsb3QodHJpdG9uLCBhZXMoeD0tYWdlLCB5PXBhbC5sYXQpKSArCiAgZ2VvbV9wb2ludChjZXg9MC4wMSwgYWxwaGE9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJQYWxlb2xhdGl0dWRlICjCsCkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpKSArCiAgZ2d0aXRsZShwYXN0ZSgiU3BhdGlvLXRlbXBvcmFsIHJlcGFydGl0aW9uIG9mIiwgZGltKHRyaXRvbilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyAtIE1pZHBvaW50IikpCgpyIDwtIGdncGxvdCh0cml0b24sIGFlcyh4PS1hZ2UpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzICggdG90YWwgb2YiLCBkaW0odHJpdG9uKVsxXSwgIikiKSkKCnA7cTtyCmBgYAoKIyMgQWRkIGFnZSB1bmNlcnRhaW50eSB0byBhdm9pZCBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFnZQoKTWFueSBvY2N1cnJlbmNlcyBoYXZlIHRoZSBleGFjdCBzYW1lIGFnZS4KCmBgYHtyfQpoZWFkKHNvcnQodGFibGUodHJpdG9uJGFnZSksIGRlY3JlYXNpbmcgPSBUKSwgNSkKYGBgCgpJbiBvcmRlciB0byBhdm9pZCBjbHVzdGVycyBsZXQncyBkcmF3IHRoZW0gdW5pZm9ybWx5IGluIHRoZWlyIGludGVydmFsIHJhdGhlciB0aGFuIHRha2luZyB0aGUgbWlkcG9pbnQgKGZvciB0aGUgIlpvbmUiIGFuZCAiTWFnbmV0byIgbWV0aG9kcykuCgpgYGB7cn0KdHJpdG9uJGFnZV9ydW5pZiA8LSB0cml0b24kYWdlCgojIFpvbmUgbWV0aG9kCmNvbmQgPC0gdHJpdG9uJGFnZS5jYWxjID09ICJab25lIgp0cml0b25bY29uZCxdJGFnZV9ydW5pZiA8LSBhcHBseSh0cml0b25bY29uZCxdLCAxLCBmdW5jdGlvbihUcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9taW4gPC0gYXMubnVtZXJpYyhUclsiYWdlLmVuIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX21heCA8LSBhcy5udW1lcmljKFRyWyJhZ2Uuc3QiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWdlX21heCA9PSBhZ2VfbWluKSBhZ2VfbWF4IDwtIGFnZV9tYXggKyAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChydW5pZigxLCBhZ2VfbWluLCBhZ2VfbWF4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQojIE1hZ25ldG8gbWV0aG9kCmNvbmQgPC0gdHJpdG9uJGFnZS5jYWxjID09ICJNYWduZXRvIgp0cml0b25bY29uZCxdJGFnZV9ydW5pZiA8LSBhcHBseSh0cml0b25bY29uZCxdLCAxLCBmdW5jdGlvbihUcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9taW4gPC0gYXMubnVtZXJpYyhUclsibWFnLmFnZS5lbiJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9tYXggPC0gYXMubnVtZXJpYyhUclsibWFnLmFnZS5zdCJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ2VfbWF4ID09IGFnZV9taW4pIGFnZV9tYXggPC0gYWdlX21heCArIDAuMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJ1bmlmKDEsIGFnZV9taW4sIGFnZV9tYXgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCmBgYAoKRm9yIG90aGVyIG1ldGhvZHMsIHNpbXBseSBhZGQgMTAwMDAgeXJzIHVuY2VydGFpbnR5IGFyb3VuZCBhZ2UgZXN0aW1hdGVzLCByZWZsZWN0aW5nIHVuaWZvcm1pc2F0aW9uIGluIHRoZSBzZWRpbWVudGF0aW9uIHByb2Nlc3MuCgpgYGB7cn0KIyBPdGhlciBtZXRob2RzCnRpbWVfc3BhbiA8LSAwLjAxICAjIDEwMDAwIHlzID0gMC4wMSBNeXMKY29uZCA8LSB0cml0b24kYWdlLmNhbGMgIT0gIlpvbmUiICYgdHJpdG9uJGFnZS5jYWxjICE9ICJNYWduZXRvIiAmIHRyaXRvbiRTcGVjaWF0aW9uID4gdHJpdG9uJEV4dGluY3Rpb24KdHJpdG9uW2NvbmQsXSRhZ2VfcnVuaWYgPC0gYXBwbHkodHJpdG9uW2NvbmQsXSwgMSwgZnVuY3Rpb24oVHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbWluIDwtIG1heChhcy5udW1lcmljKFRyWyJhZ2UiXSkgLSB0aW1lX3NwYW4vMiwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbWF4IDwtIGFzLm51bWVyaWMoVHJbImFnZSJdKSArIHRpbWVfc3Bhbi8yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50KGMoYXMubnVtZXJpYyhUclsiYWdlIl0pLCAxLjEqYXMubnVtZXJpYyhUclsiU3BlY2lhdGlvbiJdKSwgYWdlX21heCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChydW5pZigxLCBhZ2VfbWluLCBhZ2VfbWF4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKI2FnZV9taW4gPC0gc2FwcGx5KHRyaXRvbltjb25kLF0kYWdlLXRpbWVfc3Bhbi8yLCBtYXgsIDApCiNhZ2VfbWF4IDwtIHRyaXRvbltjb25kLF0kYWdlK3RpbWVfc3Bhbi8yCiNtYXBwbHkocnVuaWYsIG49MSwgbWluPWFnZV9taW4sIG1heD1hZ2VfbWF4KSAtIHRyaXRvbltjb25kLF0kYWdlX3J1bmlmCmBgYAoKYGBge3J9CmhlYWQoc29ydCh0YWJsZSh0cml0b24kYWdlX3J1bmlmKSwgZGVjcmVhc2luZyA9IFQpLCA1KQpgYGAKClRoZSBpc3N1ZSBpcyBub3cgc29sdmVkLgoKYGBge3IsIGZpZy5hc3A9MC4zLCBmaWcud2lkdGg9MTV9CnAKZ2dwbG90KHRyaXRvbiwgYWVzKHg9LWFnZV9ydW5pZiwgeT1ybm9ybShsZW5ndGgoYWdlX3J1bmlmKSwgMSwgMC4wNSkpKSArCiAgZ2VvbV9wb2ludChjZXg9MC4wMSwgYWxwaGE9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJUZW1wb3JhbCByZXBhcnRpdGlvbiBvZiIsIGRpbSh0cml0b24pWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgLSBVbmlmb3JtIGRyYXciKSkKCnEKZ2dwbG90KHRyaXRvbiwgYWVzKHg9LWFnZV9ydW5pZiwgeT1wYWwubGF0KSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMDEsIGFscGhhPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiUGFsZW9sYXRpdHVkZSAowrApIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gImJsYWNrIikpICsKICBnZ3RpdGxlKHBhc3RlKCJTcGF0aW8tdGVtcG9yYWwgcmVwYXJ0aXRpb24gb2YiLCBkaW0odHJpdG9uKVsxXSwgInJlY29yZGVkIG9jY3VycmVuY2VzIC0gVW5pZm9ybSBkcmF3IikpCmBgYAoKIyBDaGVjayB0aGUgcmVwYXJ0aXRpb24gb2Ygb2NjdXJyZW5jZXMgcGVyIHNwZWNpZXMKCmBgYHtyfQpoZWFkKHNvcnQodGFibGUodHJpdG9uJHNwZWNpZXMpLCBkZWNyZWFzaW5nID0gVCksIDEwKQpgYGAKClNvbWUgc3BlY2llcyBoYXZlIG11Y2ggbW9yZSBvY2N1cnJlbmNlcyB0aGFuIG90aGVycy4gTGV0J3MgY29tcGFyZSB0aGUgZGlzdHJpYnV0aW9uIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiBUcml0b24gY29tcGFyZWQgdG8gYSBQb2lzc29uIHNhbXBsaW5nIG92ZXIgdGhlIHNwZWNpZXMgbGlmZXRpbWUuCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMH0KZ2dwbG90KHRyaXRvbiwgYWVzKHg9cmVvcmRlcihzcGVjaWVzLCB0YWJsZShzcGVjaWVzKVtzcGVjaWVzXSkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iY291bnQiLCBmaWxsPSJkYXJrZ3JlZW4iLCBjb2w9ImRhcmtncmVlbiIpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMgbmFtZXMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBvY2N1cnJlbmNlcyAobG9nLXNjYWxlKSIsIGxpbWl0cz1jKDEsMTAwMDAwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpZGVudGlmaWVkIHRvIHRoZSBzYW1lIHNwZWNpZXMiKQoKIyBTYW1wbGUgdGhlIHNhbWUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGFzIGluIFRyaXRvbiwgYnV0IHdpdGggYSBzYW1wbGluZyBwcm9iYWJpbGl0eSBzdHJpY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNwZWNpZXMgcmFuZ2UuCnRyaXRvbl9Qb2lzc29uIDwtIGRhdGEuZnJhbWUoc3BlY2llcz1zYW1wbGUodHJpdG9uJHNwZWNpZXMsIHNpemU9bnJvdyh0cml0b24pLCByZXBsYWNlPVQsIHByb2I9dHJpdG9uJFNwZWNpYXRpb24tdHJpdG9uJEV4dGluY3Rpb24pKQoKZ2dwbG90KHRyaXRvbl9Qb2lzc29uLCBhZXMoeD1yZW9yZGVyKHNwZWNpZXMsIHRhYmxlKHNwZWNpZXMpW3NwZWNpZXNdKSkpICsKICBnZW9tX2JhcihzdGF0PSJjb3VudCIsIGZpbGw9ImRhcmtncmVlbiIsIGNvbD0iZGFya2dyZWVuIikgKyAKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiU3BlY2llcyBuYW1lcyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIG9jY3VycmVuY2VzIChsb2ctc2NhbGUpIiwgbGltaXRzPWMoMSwxMDAwMDApKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGdndGl0bGUoIkV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHVuZGVyIGEgUG9pc3NvbiBwcm9jZXNzIikKYGBgCgpgYGB7cn0KZGF0YS5mcmFtZShtZWRpYW5fdHJpdG9uID0gbWVkaWFuKHRhYmxlKHRyaXRvbiRzcGVjaWVzKSksIG1lZGlhbl9leHBlY3RlZCA9IG1lZGlhbih0YWJsZSh0cml0b25fUG9pc3NvbiRzcGVjaWVzKSkpCmBgYAoKVGhlIGV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBpcyBtb3JlIHVuZXF1YWw6IHRoZSByYXJlc3Qgc3BlY2llcyBoYXZlIGZld2VyIG9jY3VycmVuY2VzLCB0aGUgbWVkaWFuIHNwZWNpZXMgaGFzIGFyb3VuZCAxMDAgb2NjdXJyZW5jZXMsIGZvciBuZWFybHkgMjUwIGluIFRyaXRvbi4KCiMgU2F2ZSBkYXRhYmFzZQoKYGBge3J9CndyaXRlLmNzdih0cml0b24sICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl90cmltbWVkX3J1bmlmLmNzdiIpCmBgYAo=